package vip.liux.backend.infrastructure.excel;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.write.handler.WriteHandler;
import lombok.Data;
import vip.liux.backend.infrastructure.excel.head.HeadGenerator;
import vip.liux.backend.infrastructure.excel.hook.ExportExcelHook;

import java.util.Collections;
import java.util.List;

/**
 * Excel 导出上下文配置
 */
@Data
public class ExportContext {
    /**
     * 导出文件密码（可选）
     */
    private String password;
    /**
     * 导出 sheet 配置列表，默认包含一个 sheet
     */
    private List<Sheet> sheets = Collections.singletonList(new Sheet());
    /**
     * 是否使用内存模式导出，默认 false
     */
    private boolean inMemory = false;
    /**
     * 本地模板文件路径（可选，用于模板导出）
     */
    private String localTemplate;
    /**
     * 远程模板处理类（可选，用于自定义模板导出）
     */
    private Class<? extends ExportExcelHook> remoteTemplate;
    /**
     * 远程模板名称（可选）
     */
    private String remoteTemplateName;
    /**
     * 需要导出的字段名集合，优先级高于 excludes
     */
    private List<String> includes = Collections.emptyList();
    /**
     * 需要排除导出的字段名集合
     */
    private List<String> excludes = Collections.emptyList();
    /**
     * 写入处理器集合（如自定义样式、合并单元格等）
     */
    private List<Class<? extends WriteHandler>> writeHandlers = Collections.emptyList();
    /**
     * 自定义类型转换器集合
     */
    private List<Class<? extends Converter<?>>> converter = Collections.emptyList();
    /**
     * 自定义表头生成器类
     */
    private Class<? extends HeadGenerator> headGenerateClass;
    /**
     * 是否为填充模式（true 表示模板填充导出）
     */
    private boolean fill = false;

    /**
     * Excel Sheet 配置
     */
    @Data
    public static class Sheet {
        /**
         * sheet 名称，默认 "sheet1"
         */
        private String sheetName = "sheet1";
        /**
         * 需要导出的字段名集合，优先级高于 excludes
         */
        private List<String> includes = Collections.emptyList();
        /**
         * 需要排除导出的字段名集合
         */
        private List<String> excludes = Collections.emptyList();
        /**
         * 自定义表头生成器类
         */
        private Class<? extends HeadGenerator> headGenerateClass;
    }
}